﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;

namespace CHGK.web.UI.Core
{
    /// Статический класс предоставляющий методы облегчающие выполнение 
    /// типичных задач связанных с шифрованием данных, получением стойких хеш-функций
    /// </summary>
    public class CryptoHelper
    {
        /// <summary>
        /// Возвращает хеш-код строки 'value' с добавлением 'seed' в HEX формате. 
        /// Данный способ получения хеша значительно усложняет атаки подбора пароля по словарю по заранее вычисленных хеш-кодам.
        /// Как правило в качестве 'value' передают пароль, а в качестве 'seed' - имя пользователя.
        /// Длина - 40 символов. Пример: 2E87FA98...D4
        /// </summary>
        public string GetSeededHashCode(string seed, string value)
        {
            return GetHashCode(string.Format("{0}_{1}", seed, value));
        }

        /// <summary>
        /// Возвращает хеш-код строки в HEX формате. Длина - 40 символов. Пример: 2E87FA98...D4.
        /// Алгоритм sha1
        /// </summary>
        public string GetHashCode(string input)
        {
            return BuildHashString(input, System.Security.Cryptography.SHA1CryptoServiceProvider.Create());
        }

        private string BuildHashString(string input, System.Security.Cryptography.HashAlgorithm algo)
        {
            var result = new StringBuilder(algo.HashSize / 4);
            var inputBytes = Encoding.UTF8.GetBytes(input);
            var outputBytes = algo.ComputeHash(inputBytes);

            foreach (byte b in outputBytes)
            {
                result.AppendFormat("{0:X2}", b);
            }
            return result.ToString();
        }

        /// <summary>
        /// Вычисляет хеш код по алогритму sha1
        /// </summary>
        public byte[] GetHashCode(byte[] inputBytes)
        {
            System.Security.Cryptography.SHA1 sha1 = System.Security.Cryptography.SHA1CryptoServiceProvider.Create();
            var outputBytes = sha1.ComputeHash(inputBytes);
            return outputBytes;
        }
        /*public bool CheckPassword(string userName, string password)
        {
            var account = GetAccountByName(userName);
            return account.PassHash == CryptoHelper.GetSeededHashCode(userName, password);
        }
         */
    }
}